演示Heap Spray(堆喷射)的原理 您所在的位置:网站首页 spray and pray什么意思 演示Heap Spray(堆喷射)的原理

演示Heap Spray(堆喷射)的原理

2024-01-16 05:32| 来源: 网络整理| 查看: 265

0:000> dd baseObj L1 0012ff6c 004300A0

12ff6c是指针变量baseObj在栈上的地址,其值指向0x4300A0----这是分配在堆上的base对象。从这开始的4B是base对象的虚函数表指针,其值:

0:000> dd 4300a0 L1 004300A0 0042202c虚函数表指针当然就指向虚函数表,表中每项都是函数指针,当程序调用虚函数时就会依次通过检索虚函数表指针->虚函数表->虚函数来定位要执行的代码。

    基于上面这种程序定位虚函数的方法,要利用虚函数的核心就变成伪造虚函数表。常见方法有:溢出栈变量,因为baseObj指针保存在栈上,溢出后baseObj指向的不再是堆上的base对象,而是指向某个被伪造的数值。这样,baseObj就认为这个伪造的数值就是从new base;返回的对象。接着只要在这个伪造的数值上继续构造虚函数表以及虚函数指针,就能达到利用的目的。

    当程序调用new分配大约200M的虚拟空间后,应该会把分配得到的空间存放到crt堆的VirtualAllocdBlocks队列中:

0:000> dt _PEB 7ffdf000 ;查看进程堆分布 ntdll!_PEB +0x088 NumberOfHeaps : 4 +0x090 ProcessHeaps : 0x773a8500 -> 0x001c0000 Void ;进程有4个堆 堆句柄记录在0x773a8500开始的数组中 0:000> dd 0x773a8500 L8 773a8500 001c0000 00010000 00020000 003c0000 ;crt堆一般是程序堆数组元素中最后一个 所以调用new char[bufLen];后挂入从0x3c0000开始处的堆虚拟分配的HEAP!VirtualAllocdBlocks队列 0:000> dt _HEAP 003c0000 ntdll!_HEAP +0x0a0 VirtualAllocdBlocks : _LIST_ENTRY [ 0x630000 - 0x630000 ] 0:000> dd 0x530000 00630000 003c00a0 003c00a0 ; dd buff L1 0012ff64 00000000 ;buff位于栈地址0x12ff64 0:000> dd baseObj L1 0012ff6c 004300a0 ;baseObj位于栈地址0x12ff6c,覆盖后baseObj的虚函数表vftable指针值被设置为0x0c0c0c0c之后baseObj去虚函数表0x0c0c0c0c中取虚函数,由于0x0c0c0c0c附近的内存块取到的值都是0x0c0c0c0c,而这个值被进程当做函数指针,因此最后会发生类似call 0x0c0c0c0c,引导Eip去堆空间0x0c0c0c0c处取指令运行。eip将执行不痛不痒的指令,最终将执行到堆空间的最后部分----那是我们的Shellcode部分。

总结起来:堆喷射是比较简单的一种利用方式;不同以往将shellcode存放在栈中,堆喷射将shellcode放在堆中,通过多种溢出方式组合使Eip执行到0x0c0c0c0c之类的堆空间



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有